package com.okq.dao.base;

import com.okq.util.page.Page;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 描述 : 基础数据操作类
 * 作者 : zdl
 * 日期 : 2017/3/15 11:57
 */
public interface IBaseDao<T> {

    /**
     * 保存一个对象
     *
     * @param o Object
     */
    void save(T o);

    /**
     * 删除一个对象
     *
     * @param o Object
     */
    void delete(T o);

    /**
     * 更新一个对象
     *
     * @param o Object
     */
    void update(T o);

    /**
     * 保存或更新对象
     *
     * @param o Object
     */
    void saveOrUpdate(T o);

    /**
     * 查询
     *
     * @param hql hql语句
     * @return list
     */
    List<T> find(String hql);

    /**
     * 查询最多多少条
     * @param hql hql语句
     * @param max 最多多少条
     * @return list
     */
    List<T> findMax(String hql,int max);
    /**
     * 原生sql查询list
     *
     * @param sql sql语句
     * @return list
     */
    List<T> findSql(String sql);

    /**
     * 查询集合
     *
     * @param hql   hql语句
     * @param param 参数Map
     * @return list
     */
    List<T> find(String hql, Map<String, Object> param);


    /**
     * 查询集合(带分页)
     *
     * @param hql   hql语句
     * @param param 参数Map
     * @param page  查询第几页
     * @param rows  每页显示几条记录
     * @return list
     */
    List<T> find(String hql, Map<String, Object> param, Integer page, Integer rows);

    /**
     * 获得一个对象
     *
     * @param c  对象类型
     * @param id id主鍵
     * @return Object
     */
    T get(Class<T> c, Serializable id);

    /**
     * 获得一个对象
     *
     * @param hql hql语句
     * @return Object
     */
    T get(String hql);

    /**
     * 获得一个对象
     *
     * @param hql   hql语句
     * @param param 参数Map
     * @return Object
     */
    T get(String hql, Map<String, Object> param);

    /**
     * select count(*) from 类
     *
     * @param hql hql语句
     * @return long
     */
    Long count(String hql);

    /**
     * select count(*) from 类
     *
     * @param hql   hql语句
     * @param param 参数Map
     * @return long
     */
    Long count(String hql, Map<String, Object> param);

    /**
     * 执行HQL语句
     *
     * @param hql hql语句
     * @return 响应数目
     */
    Integer executeHql(String hql);

    /**
     * 执行HQL语句
     *
     * @param hql   hql语句
     * @param param 参数Map
     * @return 响应数目
     */
    Integer executeHql(String hql, Map<String, Object> param);

    /**
     * 分页查询
     *
     * @param var1 page
     * @param var2 hql
     * @param var3 param Map
     * @return page
     */
    Page<T> findByPage(Page<T> var1, String var2, Map<String, Object> var3);

}
